package com.engagesoft.cashflow.controlador;

import com.engagesoft.cashflow.bean.MovimientoDocumentoFacade;
import com.engagesoft.cashflow.controlador.util.JsfUtil;
import com.engagesoft.cashflow.controlador.util.JsfUtil.PersistAction;
import com.engagesoft.cashflow.entidades.Documento;
import com.engagesoft.cashflow.entidades.MovimientoDocumento;
import java.io.Serializable;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.enterprise.context.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.inject.Named;
import org.primefaces.component.datatable.DataTable;
import org.primefaces.context.RequestContext;
import org.primefaces.event.RowEditEvent;

@Named("movimientoDocumentoController")
@SessionScoped
public class MovimientoDocumentoController implements Serializable {

    @EJB
    private com.engagesoft.cashflow.bean.MovimientoDocumentoFacade ejbFacade;
    private List<MovimientoDocumento> items = null;
    private List<MovimientoDocumento> objetos = null;
    private List<MovimientoDocumento> egresos = null;
    private MovimientoDocumento selected;
    private Documento docSelected;
    private Documento documento;
    private Documento eg;
    private Integer identificador;
    private double suma;

    public MovimientoDocumentoController() {
    }

    public double getSuma() {
        return suma;
    }

    public void setSuma(double suma) {
        this.suma = suma;
    }
    
    public Documento getEg() {
        return eg;
    }

    public void setEg(Documento eg) {
        this.eg = eg;
    }

    public List<MovimientoDocumento> getEgresos() {
        //cargarMovimientosEgresos(docSelected);
        return egresos;
    }

    public Documento getDocumento() {
        return documento;
    }

    public void setDocumento(Documento documento) {
        this.documento = documento;
    }

    public void setEgresos(List<MovimientoDocumento> egresos) {
        this.egresos = egresos;
    }

    public Integer getIdentificador() {
        return identificador;
    }

    public List<MovimientoDocumento> getObjetos() {
        return objetos;
    }

    public void setObjetos(List<MovimientoDocumento> objetos) {
        this.objetos = objetos;
    }

    public void setIdentificador(Integer identificador) {
        this.identificador = identificador;
    }

    public Documento getDocSelected() {
        return docSelected;
    }

    public void setDocSelected(Documento docSelected) {
        this.docSelected = docSelected;
    }

    public MovimientoDocumento getSelected() {
        return selected;
    }

    public void setSelected(MovimientoDocumento selected) {
        this.selected = selected;
    }

    protected void setEmbeddableKeys() {
    }

    protected void initializeEmbeddableKey() {
    }

    private MovimientoDocumentoFacade getFacade() {
        return ejbFacade;
    }

    public MovimientoDocumento prepareCreate() {
        selected = new MovimientoDocumento();
        initializeEmbeddableKey();
        selected.setIdDocumento(docSelected);
        return selected;
    }

    public void create() {
        persist(PersistAction.CREATE, ResourceBundle.getBundle("/Bundle").getString("MovimientoDocumentoCreated"));
        if (!JsfUtil.isValidationFailed()) {
            objetos = null;
            cargarMovimientos(documento);
        }
    }

    public void createEgreso() {
        persist(PersistAction.CREATE, ResourceBundle.getBundle("/Bundle").getString("MovimientoDocumentoCreated"));
        if (!JsfUtil.isValidationFailed()) {
            egresos = null;
            cargarMovimientosEgresos(eg);
        }
    }

    public void update() {
        persist(PersistAction.UPDATE, ResourceBundle.getBundle("/Bundle").getString("MovimientoDocumentoUpdated"));
    }

    public void destroy() {
        persist(PersistAction.DELETE, ResourceBundle.getBundle("/Bundle").getString("MovimientoDocumentoDeleted"));
        if (!JsfUtil.isValidationFailed()) {
            selected = null; // Remove selection
            objetos = null;
            egresos = null;
            docSelected = null;
        }
    }

    public void limpiarSel() {
        if (JsfUtil.isValidationFailed()) {
            egresos = null;
            objetos = null;
            docSelected = null;
            selected = null;
        }
    }

    public void guardarObjetoIngreso(Documento doc) {
        documento = doc;
    }

    public void guardarObjetoEgreso(Documento doc) {
        eg = doc;
    }

    public List<MovimientoDocumento> cargarMovimientos(Documento doc) {
        guardarObjetoIngreso(doc);

        if (objetos == null) {
            docSelected = doc;
            //doc.getValorDoc();
            objetos = getFacade().encontrarPorIdDocumento(doc);
            sumarMovimientos(objetos);
        }

        sumarMovimientos(objetos);
        
        return objetos;
    }
    
    public void ejecutarSuma(){
        sumarMovimientos(objetos);
    }
    
    public void mostrarDialogo(){
        RequestContext context = RequestContext.getCurrentInstance();
        context.execute("MovimientoDocumentoCreateDialogMov.show()");
    }
    
    public void sumarMovimientos(List<MovimientoDocumento> objs){
        for(MovimientoDocumento md : objs){
            suma += md.getValorMov();
        }
        
        if (suma != docSelected.getValorDoc()){
            String msn = "la suma de los movimientos es diferente de la suma total del documento";            
            JsfUtil.addErrorMessage(msn);
            suma = 0;
        }else{
            String msn = "la suma coincide";
            JsfUtil.addSuccessMessage(msn);            
            suma = 0;
        }
    }

    public List<MovimientoDocumento> cargarMovimientosEgresos(Documento doc) {
        guardarObjetoEgreso(doc);

        if (egresos == null) {
            docSelected = doc;
            egresos = getFacade().encontrarPorIdDocumento(doc);
        }

        return egresos;
    }

    public List<MovimientoDocumento> getItems() {
        if (items == null) {
            items = getFacade().findAll();
        }
        return items;
    }

    private void persist(PersistAction persistAction, String successMessage) {
        if (selected != null) {
            setEmbeddableKeys();
            try {
                if (persistAction != PersistAction.DELETE) {
                    getFacade().edit(selected);
                } else {
                    getFacade().remove(selected);
                }
                JsfUtil.addSuccessMessage(successMessage);
            } catch (EJBException ex) {
                String msg = "";
                Throwable cause = ex.getCause();
                if (cause != null) {
                    msg = cause.getLocalizedMessage();
                }
                if (msg.length() > 0) {
                    JsfUtil.addErrorMessage(msg);
                } else {
                    JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
                }
            } catch (Exception ex) {
                Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
                JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            }
        }
    }

    public MovimientoDocumento getMovimientoDocumento(java.lang.Integer id) {
        return getFacade().find(id);
    }

    public List<MovimientoDocumento> getItemsAvailableSelectMany() {
        return getFacade().findAll();
    }

    public List<MovimientoDocumento> getItemsAvailableSelectOne() {
        return getFacade().findAll();
    }

    @FacesConverter(forClass = MovimientoDocumento.class)
    public static class MovimientoDocumentoControllerConverter implements Converter {

        @Override
        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            MovimientoDocumentoController controller = (MovimientoDocumentoController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "movimientoDocumentoController");
            return controller.getMovimientoDocumento(getKey(value));
        }

        java.lang.Integer getKey(String value) {
            java.lang.Integer key;
            key = Integer.valueOf(value);
            return key;
        }

        String getStringKey(java.lang.Integer value) {
            StringBuilder sb = new StringBuilder();
            sb.append(value);
            return sb.toString();
        }

        @Override
        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof MovimientoDocumento) {
                MovimientoDocumento o = (MovimientoDocumento) object;
                return getStringKey(o.getIdMovimiento());
            } else {
                Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "object {0} is of type {1}; expected type: {2}", new Object[]{object, object.getClass().getName(), MovimientoDocumento.class.getName()});
                return null;
            }
        }

    }

}
